package edu.uoc.tdp.servidor.bbdd.conexio;

import edu.uoc.tdp.bbdd.GestorDiscConnexio;
import edu.uoc.tdp.beans.conexio.Administrador;
import edu.uoc.tdp.beans.conexio.Estudiant;
import edu.uoc.tdp.beans.conexio.ResponsableEvents;
import edu.uoc.tdp.beans.conexio.Usuari;
import edu.uoc.tdp.common.EOlympicsException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * Classe GestorUsuaris
 * TDP Grup TDP 1X4J
 */
public class GestorUsuaris {
    
    private GestorDiscConnexio gestor;
    private Connection connexio;

    /**
     * Constructor de la classe Gestora
     * Crea un nou gestor de disc.
     */
    public GestorUsuaris() throws EOlympicsException {
        this.gestor = new GestorDiscConnexio();
        this.gestor.obreConnexioBD();
        this.connexio = gestor.getConnexio();
    }

    /**
     * Constructor de la classe Gestora
     * Utilitza el gestor de disc passat com a paràmetre
     * @param gdc connexió a la BD de tipus GestorDiscConnexio
     */
    public GestorUsuaris(GestorDiscConnexio gdc) {
        this.gestor   = gdc;
        this.connexio = gdc.getConnexio();
    }
    
    
    /**
     * Consulta d'un Usuari pel seu Id
     * @param IdUsu Identificador de l'Usuari
     * @return objecte Usuari amb Identificador igual al passat com a paràmete
     * @exception EOlympicsException
     */
    public Usuari obtenirUsuari(int IdUsu) throws EOlympicsException {
        Usuari usu = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT idUsuari, pwd, email, " +
                "tipusDocumentId, document, nom, cognom1, cognom2, estatEnSistema " +
                "FROM USUARI " + 
                "WHERE idIntern = " + IdUsu +
                " AND dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                usu = new Usuari(rs.getString(1), rs.getString(2),
                                 rs.getString(3), rs.getString(4),
                                 rs.getString(5), rs.getString(6),
                                 rs.getString(7), rs.getString(8),
                                 rs.getString(9));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return usu;
    }

    /**
     * Consulta d'un Administrador pel seu Id
     * @param IdUsu Identificador de l'Administrador
     * @return objecte Administrador amb Identificador igual al passat com a paràmete
     * @exception EOlympicsException
     */
    public Administrador obtenirAdministrador(int IdAdm) throws EOlympicsException {
        Administrador adm = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT u.idUsuari, u.pwd, u.email, " +
                "u.tipusDocumentId, u.document, u.nom, u.cognom1, u.cognom2, u.estatEnSistema " +
                "FROM ADMINISTRADOR as a, USUARI as u " + 
                "WHERE a.idAdministrador = " + IdAdm +
                " AND a.idAdministrador = u.idIntern" +
                " AND u.tipusUsuari = 'A'" +
                " AND u.dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                adm = new Administrador(rs.getString(1), rs.getString(2),
                                 rs.getString(3), rs.getString(4),
                                 rs.getString(5), rs.getString(6),
                                 rs.getString(7), rs.getString(8),
                                 rs.getString(9));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return adm;
    }
    
    /**
     * Consulta d'un Responsable d'events pel seu Id
     * @param IdREv Identificador del responsable d'events
     * @return objecte ResponsableEvents amb Identificador igual al passat com a paràmete
     * @exception EOlympicsException
     */
    public ResponsableEvents obtenirResponsableEvents(int IdREv) throws EOlympicsException {
        ResponsableEvents REv = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT u.idUsuari, u.pwd, u.email, " +
                "u.tipusDocumentId, u.document, u.nom, u.cognom1, u.cognom2, u.estatEnSistema " +
                "FROM RESPONSABLEEVENTS as r, USUARI as u " + 
                "WHERE r.idRsponsable = " + IdREv + " " +
                "AND r.idResponsable = u.idIntern" +
                " AND u.tipusUsuari = 'R'" +
                " AND dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                REv = new ResponsableEvents(rs.getString(1), rs.getString(2),
                                 rs.getString(3), rs.getString(4),
                                 rs.getString(5), rs.getString(6),
                                 rs.getString(7), rs.getString(8),
                                 rs.getString(9));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return REv;
    }
    
    /**
     * Consulta d'un estudiant pel seu Id
     * @param IdEst Identificador de l'estudiant
     * @return objecte Estudiant amb Identificador igual al passat com a paràmete
     * @exception EOlympicsException
     */
    public Estudiant obtenirEstudiant(int IdEst) throws EOlympicsException {
        Estudiant est = null;
        Statement sentencia = gestor.creaSentencia();
        String select = "SELECT e.universitat, u.idUsuari, u.pwd, u.email, " +
                "u.tipusDocumentId, u.document, u.nom, u.cognom1, u.cognom2, u.estatEnSistema " +
                "FROM ESTUDIANT as e, USUARI as u " + 
                "WHERE e.idEstudiant = " + IdEst +
                " AND e.idEstudiant = u.idIntern" +
                " AND u.tipusUsuari = 'E'" +
                " AND dataBaixa IS NULL;";
        try {
            ResultSet rs = sentencia.executeQuery(select);
            if (rs.next()) {
                est = new Estudiant(rs.getString(1), rs.getString(2),
                                    rs.getString(3), rs.getString(4),
                                    rs.getString(5), rs.getString(6),
                                    rs.getString(7), rs.getString(8),
                                    rs.getString(9), rs.getString(10));
            }
            rs.close();
            sentencia.close();

        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return est;
    }

    /**
     * Mètode que obté la llista d'usuaris del sistema no donats de baixa
     * @return Llista dels Usuaris
     * @exception EOlympicsException
     */
    public List<Usuari> obtenirLlistaUsuaris() throws EOlympicsException {
        List<Usuari> LlistaUsuaris = new ArrayList<Usuari>();
        Usuari Usuari;

        try {
            Statement sentencia = gestor.creaSentencia();
            String select = "SELECT idUsuari, pwd, email, " +
                            "tipusDocumentId, document, nom, cognom1, cognom2, estatEnSistema" +
                            " FROM USUARI" +
                            " WHERE dataBaixa IS NULL" +
                            " ORDER BY cognom1, cognom2, nom;";
            ResultSet rs = sentencia.executeQuery(select);
            while (rs.next()) {
                Usuari = new Usuari(rs.getString(1), rs.getString(2),
                                    rs.getString(3), rs.getString(4),
                                    rs.getString(5), rs.getString(6),
                                    rs.getString(7), rs.getString(8),
                                    rs.getString(9));
                LlistaUsuaris.add(Usuari);
            }
            rs.close();
            sentencia.close();
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_SQL);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_DESC_EXEC);
        }
        return LlistaUsuaris;
    }    
    
}
